Fix a bug where we could end up trying to handle the same event more than
authorRichard Hult <richard@imendio.com>
Mon, 10 Dec 2007 19:00:23 +0000 (19:00 +0000)
committerRichard Hult <rhult@src.gnome.org>
Mon, 10 Dec 2007 19:00:23 +0000 (19:00 +0000)
2007-12-10  Richard Hult  <richard@imendio.com>

* gdk/quartz/gdkprivate-quartz.h:
* gdk/quartz/gdkeventloop-quartz.c:
(_gdk_quartz_event_loop_get_pending),
(_gdk_quartz_event_loop_check_pending),
(_gdk_quartz_event_loop_release_event), (gdk_event_prepare),
(gdk_event_check), (gdk_event_dispatch):
* gdk/quartz/gdkevents-quartz.c: (gdk_events_pending)
(_gdk_events_queue): Fix a bug where we could end up trying to
handle the same event more than once. Based on patch from Paul
Davis.

svn path=/trunk/; revision=19143

ChangeLog
gdk/quartz/gdkeventloop-quartz.c
gdk/quartz/gdkevents-quartz.c
gdk/quartz/gdkprivate-quartz.h

index 0e5ca552b4499ca42e9e4471efcd3dcfd6a083da..338d50b4783f918e9b5a34eaa8eb5c2d382fd69b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2007-12-10  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/gdkprivate-quartz.h: 
+       * gdk/quartz/gdkeventloop-quartz.c:
+       (_gdk_quartz_event_loop_get_pending),
+       (_gdk_quartz_event_loop_check_pending),
+       (_gdk_quartz_event_loop_release_event), (gdk_event_prepare),
+       (gdk_event_check), (gdk_event_dispatch):
+       * gdk/quartz/gdkevents-quartz.c: (gdk_events_pending)
+       (_gdk_events_queue): Fix a bug where we could end up trying to
+       handle the same event more than once. Based on patch from Paul
+       Davis.
+
 2007-12-10  Tor Lillqvist  <tml@novell.com>
 
        * gtk-zip.sh.in: Include bin/gtk-builder-convert in the dev
index d9e9ad85e7e085247b1a97b43be95b4bd7710922..a696a39e75287158d77dde2ff1721ed3b454615e 100644 (file)
@@ -24,12 +24,37 @@ static guint n_pollfds;
 static CFRunLoopSourceRef select_main_thread_source;
 static CFRunLoopRef main_thread_run_loop;
 
+gboolean
+_gdk_quartz_event_loop_check_pending (void)
+{
+  return current_event != NULL;
+}
+
+NSEvent*
+_gdk_quartz_event_loop_get_pending (void)
+{
+  NSEvent *event;
+
+  event = current_event;
+  current_event = NULL;
+
+  return event;
+}
+
+void
+_gdk_quartz_event_loop_release_event (NSEvent *event)
+{
+  [event release];
+}
+
 static gboolean
 gdk_event_prepare (GSource *source,
                   gint    *timeout)
 {
   NSEvent *event;
   gboolean retval;
+
+  GDK_THREADS_ENTER ();
   
   GDK_QUARTZ_ALLOC_POOL;
 
@@ -45,19 +70,27 @@ gdk_event_prepare (GSource *source,
 
   GDK_QUARTZ_RELEASE_POOL;
 
+  GDK_THREADS_LEAVE ();
+
   return retval;
 }
 
 static gboolean
 gdk_event_check (GSource *source)
 {
+  gboolean retval;
+
+  GDK_THREADS_ENTER ();
+
   if (_gdk_event_queue_find_first (_gdk_display) != NULL ||
-      current_event)
-    return TRUE;
+      _gdk_quartz_event_loop_check_pending ())
+    retval = TRUE;
+  else
+    retval = FALSE;
 
-  /* FIXME: We should maybe try to fetch an event again here */
+  GDK_THREADS_LEAVE ();
 
-  return FALSE;
+  return retval;
 }
 
 static gboolean
@@ -67,6 +100,8 @@ gdk_event_dispatch (GSource     *source,
 {
   GdkEvent *event;
 
+  GDK_THREADS_ENTER ();
+
   GDK_QUARTZ_ALLOC_POOL;
 
   _gdk_events_queue (_gdk_display);
@@ -83,6 +118,8 @@ gdk_event_dispatch (GSource     *source,
 
   GDK_QUARTZ_RELEASE_POOL;
 
+  GDK_THREADS_LEAVE ();
+
   return TRUE;
 }
 
@@ -264,11 +301,6 @@ poll_func (GPollFD *ufds, guint nfds, gint timeout_)
     {
       ufds[0].revents = G_IO_IN;
 
-      /* FIXME: We can't assert here, but we might need to have a
-       * queue for events instead.
-       */
-      /*g_assert (current_event == NULL);*/
-
       current_event = [event retain];
 
       n_active ++;
@@ -298,16 +330,3 @@ _gdk_quartz_event_loop_init (void)
  
 }
 
-NSEvent *
-_gdk_quartz_event_loop_get_current (void)
-{
-  return current_event;
-}
-
-void
-_gdk_quartz_event_loop_release_current (void)
-{
-  [current_event release];
-  current_event = NULL;
-}
-
index 01dea29dcac80252cbd2971971efcb27223e3794..832646cd6b434ad98e516f40e60d48d18a6627d0 100644 (file)
@@ -130,7 +130,7 @@ gboolean
 gdk_events_pending (void)
 {
   return (_gdk_event_queue_find_first (_gdk_display) ||
-         (_gdk_quartz_event_loop_get_current () != NULL));
+         (_gdk_quartz_event_loop_check_pending ()));
 }
 
 GdkEvent*
@@ -1829,14 +1829,15 @@ gdk_event_translate (NSEvent *nsevent)
 void
 _gdk_events_queue (GdkDisplay *display)
 {  
-  NSEvent *current_event = _gdk_quartz_event_loop_get_current ();
+  NSEvent *event;
 
-  if (current_event)
+  event = _gdk_quartz_event_loop_get_pending ();
+  if (event)
     {
-      if (!gdk_event_translate (current_event)) 
-       [NSApp sendEvent:current_event];
-               
-      _gdk_quartz_event_loop_release_current ();
+      if (!gdk_event_translate (event))
+        [NSApp sendEvent:event];
+
+      _gdk_quartz_event_loop_release_event (event);
     }
 }
 
index c3b7b0bc63886b56c0d92d3ca49834c4d5fd8130..e322e43405097e619bab08fe033b9f6f3ce2ed6c 100644 (file)
@@ -158,8 +158,9 @@ extern GdkWindow *_gdk_quartz_keyboard_grab_window;
 extern GdkWindow *_gdk_quartz_pointer_grab_window;
 
 /* Event loop */
-NSEvent *  _gdk_quartz_event_loop_get_current     (void);
-void       _gdk_quartz_event_loop_release_current (void);
+gboolean   _gdk_quartz_event_loop_check_pending (void);
+NSEvent *  _gdk_quartz_event_loop_get_pending   (void);
+void       _gdk_quartz_event_loop_release_event (NSEvent *event);
 
 /* FIXME: image */
 GdkImage *_gdk_quartz_image_copy_to_image (GdkDrawable *drawable,